import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 生成广电用户数据的SQL插入语句文件
 * 这个工具直接读取CSV文件并生成SQL文件，用户可以手动在数据库中执行
 */
public class GenerateSqlInsert {
    
    public static void main(String[] args) {
        System.out.println("开始生成SQL插入语句...");
        
        // CSV文件路径
        String csvFilePath = "C:/Users/Administrator/RuoYi-Vue/guangdian-data-analysis/宽表数据.csv";
        // SQL文件输出路径
        String sqlFilePath = "C:/Users/Administrator/RuoYi-Vue/guangdian_insert.sql";
        
        // 检查CSV文件是否存在
        File csvFile = new File(csvFilePath);
        if (!csvFile.exists()) {
            System.err.println("错误：CSV文件不存在：" + csvFilePath);
            System.err.println("请确保CSV文件已放置在正确路径");
            return;
        }
        
        System.out.println("发现CSV文件：" + csvFilePath);
        System.out.println("文件大小：" + (csvFile.length() / 1024) + "KB");
        
        try (BufferedReader reader = new BufferedReader(new FileReader(csvFilePath));
             FileWriter writer = new FileWriter(sqlFilePath)) {
            
            // 写入SQL注释和开始语句
            writer.write("-- 广电用户数据插入SQL\n");
            writer.write("-- 生成时间：" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "\n");
            writer.write("-- 导入记录数限制：2000条\n\n");
            writer.write("SET FOREIGN_KEY_CHECKS = 0;\n");
            writer.write("SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';\n\n");
            
            String line;
            boolean isFirstLine = true; // 跳过表头
            int count = 0;
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            
            while ((line = reader.readLine()) != null) {
                if (isFirstLine) {
                    isFirstLine = false;
                    continue;
                }
                
                // 限制导入2000条数据
                if (count >= 2000) {
                    break;
                }
                
                String[] fields = line.split(",", -1);
                if (fields.length >= 20) { // 确保有足够的字段
                    try {
                        // 生成INSERT语句
                        String insertSql = generateInsertStatement(fields, formatter, dateFormatter);
                        writer.write(insertSql);
                        writer.write("\n");
                        count++;
                        
                        // 每100条显示一次进度
                        if (count % 100 == 0) {
                            System.out.println("已生成 " + count + " 条SQL语句");
                        }
                    } catch (Exception e) {
                        System.err.println("处理第" + (count + 1) + "行数据时出错：" + e.getMessage());
                        // 跳过当前行，继续处理
                    }
                }
            }
            
            // 写入结束语句
            writer.write("\nSET FOREIGN_KEY_CHECKS = 1;\n");
            writer.write("SET SQL_MODE = DEFAULT;\n");
            
            System.out.println("\nSQL文件生成完成！");
            System.out.println("生成的SQL文件路径：" + sqlFilePath);
            System.out.println("成功生成 " + count + " 条插入语句");
            System.out.println("\n使用方法：");
            System.out.println("1. 打开MySQL客户端工具（如MySQL Workbench、Navicat等）");
            System.out.println("2. 连接到ry-vue数据库");
            System.out.println("3. 执行生成的SQL文件：source " + sqlFilePath);
            System.out.println("4. 导入完成后，刷新仪表盘页面查看统计数据");
            
        } catch (Exception e) {
            System.err.println("生成SQL文件时发生错误：" + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 生成单条INSERT语句
     */
    private static String generateInsertStatement(String[] fields, DateTimeFormatter formatter, DateTimeFormatter dateFormatter) {
        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO guang_dian_user (terminal_no, phone_no, sm_name, run_name, sm_code, owner_name, owner_code, ");
        sql.append("run_time, address, estate_name, open_time, force_flag, is_heavy_user, tv_consumption_level, ");
        sql.append("broadband_consumption_level, is_loyal_user, service_brand, tv_penetration, broadband_penetration, user_type, ");
        sql.append("create_by, create_time) VALUES (");
        
        // 添加字段值，注意转义单引号
        sql.append("'").append(escapeSql(fields[0])).append("', "); // terminal_no
        sql.append("'").append(escapeSql(fields[1])).append("', "); // phone_no
        sql.append("'").append(escapeSql(fields[2])).append("', "); // sm_name
        sql.append("'").append(escapeSql(fields[3])).append("', "); // run_name
        sql.append("'").append(escapeSql(fields[4])).append("', "); // sm_code
        sql.append("'").append(escapeSql(fields[5])).append("', "); // owner_name
        sql.append("'").append(escapeSql(fields[6])).append("', "); // owner_code
        
        // 处理run_time
        if (fields.length > 7 && fields[7] != null && !fields[7].trim().isEmpty()) {
            try {
                LocalDateTime runTime = LocalDateTime.parse(fields[7], formatter);
                sql.append("'").append(runTime.format(formatter)).append("', ");
            } catch (Exception e) {
                sql.append("'").append(LocalDateTime.now().format(formatter)).append("', ");
            }
        } else {
            sql.append("'").append(LocalDateTime.now().format(formatter)).append("', ");
        }
        
        sql.append("'").append(fields.length > 8 ? escapeSql(fields[8]) : "").append("', "); // address
        sql.append("'").append(fields.length > 9 ? escapeSql(fields[9]) : "").append("', "); // estate_name
        
        // 处理open_time
        if (fields.length > 10 && fields[10] != null && !fields[10].trim().isEmpty()) {
            try {
                LocalDateTime openTime = LocalDateTime.parse(fields[10], dateFormatter).atStartOfDay();
                sql.append("'").append(openTime.format(formatter)).append("', ");
            } catch (Exception e) {
                sql.append("'").append(LocalDateTime.now().format(formatter)).append("', ");
            }
        } else {
            sql.append("'").append(LocalDateTime.now().format(formatter)).append("', ");
        }
        
        // 添加标签字段
        sql.append("'").append(fields.length > 11 ? escapeSql(fields[11]) : "").append("', "); // force_flag
        sql.append("'").append(fields.length > 12 ? escapeSql(fields[12]) : "").append("', "); // is_heavy_user
        sql.append("'").append(fields.length > 13 ? escapeSql(fields[13]) : "").append("', "); // tv_consumption_level
        sql.append("'").append(fields.length > 14 ? escapeSql(fields[14]) : "").append("', "); // broadband_consumption_level
        sql.append("'").append(fields.length > 15 ? escapeSql(fields[15]) : "").append("', "); // is_loyal_user
        sql.append("'").append(fields.length > 16 ? escapeSql(fields[16]) : "").append("', "); // service_brand
        sql.append("'").append(fields.length > 17 ? escapeSql(fields[17]) : "").append("', "); // tv_penetration
        sql.append("'").append(fields.length > 18 ? escapeSql(fields[18]) : "").append("', "); // broadband_penetration
        sql.append("'").append(fields.length > 19 ? escapeSql(fields[19]) : "").append("', "); // user_type
        
        // 添加创建信息
        sql.append("'system', ");
        sql.append("'").append(LocalDateTime.now().format(formatter)).append("');");
        
        return sql.toString();
    }
    
    /**
     * 转义SQL字符串中的特殊字符
     */
    private static String escapeSql(String str) {
        if (str == null) {
            return "";
        }
        return str.replace("'", "''");
    }
}